﻿// See https://aka.ms/new-console-template for more information
using ConfigServices;
using ConfigServices.LayeredConfig;
using LogServices;
using MailServices;
using Microsoft.Extensions.DependencyInjection;

/**
1.目的:演示DI的能力
2.有配置服务、日志服务、然后再开发一个邮件发送器服务,可以通过配置服务来从文件、环境变量、
数据库等地方读取配置,可以通过日志服务来将程序运行过程中的信息写入文件、控制台、数据库等。
3.说明:案例中开发自己的日志、配置等接口,这只是揭示原理.
*/

IServiceCollection services = new ServiceCollection();
services.AddScoped<IMailService, MailService>();

//services.AddScoped<ILogProvider, ConsoleLogProvider>();

//同时添加环境变量和ini读取配置文件,按照注入顺序,进行覆盖,后面注入的覆盖前面的,用于实现可覆盖的配置读取器
services.AddScoped<IConfigService, EnvVarConfigService>();
services.AddConsoleLog();
services.AddLayeredConfig();
//services.AddScoped(typeof(IConfigService), _ => new IniFileConfigService { FilePath = "mail.ini" });
services.AddIniFileConfig("mail.ini");
IServiceProvider provider = services.BuildServiceProvider();

using (var scope = provider.CreateScope())
{
    IMailService mailService = scope.ServiceProvider.GetRequiredService<IMailService>();
    mailService.send("测试邮件", "dads@usa.gov", "懂王你好呀!");
}

Console.ReadKey();



/**
 *   可覆盖的配置读取器(分层的逐层覆盖的读取机制)
 *   配置中心服务器(单独部署读取数据库配置,需考虑高可用).可以本地的覆盖配置服务器的配置，或者配置文件覆盖环境变量的配置
 *   例如,按照"配置中心服务器"、"本地环境变量"、"本地配置文件"的顺序添加了三个配置提供者
 *   在"配置中心服务器"中提供了"a=1;b=2;c=3"这三个配置项,在"本地环境变量"中配置了"a=10;b=20;",
 *   在"本地配置文件"中配置了"b=200",那么最终我们读取到的时候读到的就是"a=10;b=200;c=3"
 *   
 *   
 *   集群环境中网站有多台服务器,假设10台,我改配置每一个服务器配置文件都改一遍,这时就需要中心化的配置服务器(现成的有apoll、nacos、AgileConfig)
 *   所有网站的配置都从配置中心服务器来读取,这样我只要改一个地方,所有网站的配置都能发生改变.大大降低了维护成本,把配置不是放在每个网站的本地
 *   文件里面,而是放在一个配置中心服务器里面,从配置服务器来读配置
 *   也可以自己实现,可覆盖的配置中心服务器
 *   
 *   
 *   如果某台服务器特殊原因临时需要用特殊的配置,比如灰度发布(临时把这台服务器改成测试环境都有可能),其它服务器不变,那怎么办?
 *   这时候就可以使用可覆盖的配置文件读取,它按照先读取配置服务器,再读取环境变量,再读取本地配置文件的顺序,后读到的会覆盖前面读到的配置(overwrite)
 *   这样我就可以用本地配置文件覆盖中心服务器的配置了
 *   
 *   
 *   
 */


